package com.lxmes.common.utils;

import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;

public class ObjectUtils {

    /**
     * 为指定对象的所有未初始化属性设置默认值。
     *
     * @param obj 需要检查的对象实例
     */
    public static void setUninitializedPropertiesToDefaults(Object obj) {
        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            try {
                // 设置访问权限
                field.setAccessible(true);

                // 获取属性值
                Object value = field.get(obj);

                // 检查属性值是否为 null 或者是空字符串
                if (value == null || (value instanceof String && ((String) value).isEmpty())) {
                    // 根据字段类型设置默认值
                    if (field.getType() == String.class) {
                        field.set(obj, ""); // 设置空字符串
                    } else if (field.getType() == Integer.class || field.getType() == int.class) {
                        field.set(obj, 0); // 设置整数类型的默认值为 0
                    } else if (field.getType() == Double.class || field.getType() == double.class) {
                        field.set(obj, 0.0); // 设置 double 类型的默认值为 0.0
                    } else if (field.getType() == Float.class || field.getType() == float.class) {
                        field.set(obj, 0.0f); // 设置 float 类型的默认值为 0.0f
                    } else if (field.getType() == Long.class || field.getType() == long.class) {
                        field.set(obj, 0L); // 设置 long 类型的默认值为 0L
                    } else if (field.getType() == Short.class || field.getType() == short.class) {
                        field.set(obj, (short) 0); // 设置 short 类型的默认值为 0
                    } else if (field.getType() == Byte.class || field.getType() == byte.class) {
                        field.set(obj, (byte) 0); // 设置 byte 类型的默认值为 0
                    } else if (field.getType() == Boolean.class || field.getType() == boolean.class) {
                        field.set(obj, false); // 设置布尔类型的默认值为 false
                    } else if (field.getType() == Character.class || field.getType() == char.class) {
                        field.set(obj, '\0'); // 设置字符类型的默认值为 '\0'
                    } else if (field.getType().isAssignableFrom(Collection.class)) {
                        field.set(obj, java.util.Collections.emptyList()); // 设置集合类型的默认值为空集合
                    } else if (field.getType().isAssignableFrom(Map.class)) {
                        field.set(obj, java.util.Collections.emptyMap()); // 设置映射类型的默认值为空映射
                    } else if (field.getType() == java.util.Date.class) {
                        // 设置 Date 类型的默认值为未来最远的时间点
                        field.set(obj, new java.util.Date(Long.MAX_VALUE));
                    }
                    else {
                        // 对于其他类型不做处理
                        continue;
                    }
                }

            } catch (IllegalAccessException e) {
                throw new RuntimeException("Failed to access field: " + field.getName(), e);
            }
        }
    }
}